package Day_0219.Redis;

/**
 * @author zxc
 * @date 2023/02/19 14:49
 **/
public class Redis_ThreadModel {
    public static void main(String[] args) {
        /**
         * redis 和 memcached 之间的区别
         * ===》
         * 一，redis 和 memcached 的区别
         * 1.redis 支持复杂的数据结构，而memcached 仅仅只支持String类型;
         * （1）redis 相比 memcached 来说，拥有更多的数据结构，能支持更丰富的数据操作。
         *  如果需要缓存能够支持更复杂的结构和操作， redis 会是不错的选择。
         *
         * 2.redis 原生支持集群模式
         * （1）在 redis3.x 版本中，便能支持 cluster 模式，
         * （2）而 memcached 没有原生的集群模式，需要依靠客户端，来实现往集群中分片写入数据。
         *
         * 3.性能对比
         * （1）由于 redis 是单线程模型（即，Redis有且仅能够使用单个CPU），
         * （2）memcached 可以使用多核，所以平均每一个核上 redis 在存储小数据时，比memcached 性能更高。
         *  而在 100k 以上的数据中，memcached 性能要高于 redis。
         *  虽然 redis 最近也在存储大数据的性能上进行优化，但是比起 memcached，还是稍有逊色。
         *
         *
         * 二，redis 的线程模型
         * 1.文件事件处理器（file event handler） ：
         * redis 内部使用文件事件处理器 file event handler，这个文件事件处理器是单线程的，
         * 所以 redis 才叫做单线程的模型。
         *
         * 2.IO多路复用机制
         * （1）它采用 IO 多路复用机制，同时监听多个 socket，将产生事件的 socket 压入内存队列中，
         * （2）事件分派器，根据 socket 上的事件类型，来选择对应的事件处理器进行处理。
         * （3）文件事件处理器的结构包含 4 个部分：
         *  a.多个 socket
         *  b.IO 多路复用程序
         *  c.文件事件分派器（file event handler）
         *  d.事件处理器（连接应答处理器、命令请求处理器、命令回复处理器）
         *
         * 3.Redis单线程模型详细描述
         * （1）多个 socket 可能会并发产生不同的操作，每个操作对应不同的文件事件（file event）;
         * （2）IO 多路复用程序会监听多个 socket，会将产生事件的 socket 放入队列中排队，
         * （3）事件分派器依次从队列中取出一个 socket，
         * （4）根据 socket 的事件类型，交给对应的事件处理器进行处理。
         *
         * 4.客户端与Redis的通信过程 ：
         * 1.客户端 socket01 向 redis 的server socket请求建立连接，此时server socket会产生一个AE_READABLE 事件，
         * （1）IO 多路复用程序监听到 server socket 产生的事件后，将该事件压入队列中。
         * （2）文件事件分派器从队列中获取该事件，交给 连接应答处理器 。
         * （3）连接应答处理器会创建一个能与客户端通信的 socket01，
         *  并将该 socket01 的 AE_READABLE 事件与命令请求处理器关联。
         *
         * 2.假设此时客户端发送了一个 set key value 请求，此时 redis 中的 socket01 会产生AE_READABLE 事件，
         * （1）IO 多路复用程序将事件压入队列，此时事件分派器从队列中获取到该事件，
         *  由于前面 socket01 的 AE_READABLE 事件已经与命令请求处理器关联，
         * （2）因此事件分派器，将事件交给命令请求处理器来处理。
         * （3）命令请求处理器读取 socket01 的 key-value，并在自己内存中完成 key-value 的设置。
         * （4）操作完成后，它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器相关联。
         *
         * 3.如果此时客户端准备好接收返回结果了，
         * （1）那么 redis 中的 socket01 会产生一个AE_WRITABLE 事件，同样压入队列中;
         * （2）事件分派器找到与 socket01相关联的命令回复处理器;
         * （3）由命令回复处理器对 socket01 输入本次操作的一个结果，比如 ok;
         * （4）之后，解除 socket01 的AE_WRITABLE 事件与命令回复处理器的关联。
         *
         * 四，为啥 redis 单线程模型，也能效率这么高？
         * （1）纯内存操作;
         * （2）核心，是基于非阻塞的 IO 多路复用机制;
         * （3）单线程避免了多线程的频繁上下文切换问题;
         * ===》
         * Redis是单线程模型，效率高的原因 ：
         * （1）单线程 避免了多线程之间频繁的上下文切换所带来的CPU资源浪费;
         * （2）纯内存操作;（内存的运算处理速度，是远远大于磁盘的运算处理速度的;）
         * （3）基于非阻塞的IO多路复用机制;
         *
         */
    }
}
